<?php
/**
 * @author		João Batista Neto
 * @brief		Objetos que representam cada tipo do retorno da API
 * @package		dso.buscape.result.type
 */

require_once 'dso/buscape/result/type/BuscapeComposite.php';

/**
 * @brief	Ofertas de um produto
 * @class	BuscapeOffer
 * @ingroup		Types
 */
class BuscapeOffer extends BuscapeComposite {
	/**
	 * @brief	ID da oferta
	 * @var		integer
	 */
	private $id;

	/**
	 * @brief	ID da categoria
	 * @var		integer
	 */
	private $categoryId;

	/**
	 * @brief	Nome da oferta
	 * @var		string
	 */
	private $offerName;

	/**
	 * @brief	Links
	 * @var		RecursiveComponentIterator
	 */
	private $links;

	/**
	 * @brief	Imagem da oferta
	 * @var		BuscapeThumbnail
	 */
	private $thumbnail;

	/**
	 * @brief	Preço da oferta
	 * @var		float
	 */
	private $price;

	/**
	 * @brief	Informações sobre parcelamento se houver
	 * @var		BuscapeParcel
	 */
	private $parcel;

	/**
	 * @brief	Vendedor da oferta
	 * @var		BuscapeSeller
	 */
	private $seller;

	/**
	 * @brief	Verifica se um filho é aceitável pelo componente
	 * @param	$child BuscapeComponent
	 * @return	boolean
	 * @see		BuscapeComponent.accept()
	 */
	protected function accept( IObject $child ){
		if ( parent::accept( $child ) ){
			$reflection = $child->getClass();

			return $reflection->getName() == 'BuscapeSeller' || $reflection->isSubclassOf( 'BuscapeSeller' );
		}

		return false;
	}

	/**
	 * @brief	Cria uma instância do objeto com os argumentos passados
	 * @param	$args array Lista de argumentos que serão utilizados para criação do objeto
	 * @return	BuscapeOffer
	 */
	public static function createInstance( array $args ){
		$offer = new BuscapeOffer();

		foreach ( $args as $property => $value ){
			$offer->$property = $value;
		}

		return $offer;
	}

	/**
	 * @brief	Recupera o ID da oferta
	 * @return	integer
	 */
	public function getId() {
		return $this->id;
	}

	/**
	 * @brief	Recupera o ID da categoria da oferta
	 * @return	integer
	 */
	public function getCategoryId() {
		return $this->categoryId;
	}

	/**
	 * @brief	Recupera o nome da oferta
	 * @return	string
	 */
	public function getOfferName() {
		return $this->offerName;
	}

	/**
	 * @brief	Recupera uma lista de links da oferta
	 * @return	RecursiveComponentIterator
	 */
	public function getLinks() {
		return $this->links;
	}

	/**
	 * @brief	Recupera a imagem da oferta
	 * @return	BuscapeThumbnail
	 */
	public function getThumbnail() {
		return $this->thumbnail;
	}

	/**
	 * @brief	Recupera o valor em oferta
	 * @return	float
	 */
	public function getPrice() {
		return $this->price;
	}

	/**
	 * @brief	Recupera informações sobre parcelamento se houver
	 * @return	BuscapeParcel
	 */
	public function getParcel() {
		return $this->parcel;
	}

	/**
	 * @brief	Recupera informações sobre o vendedor da oferta
	 * @return	BuscapeSeller
	 */
	public function getSeller() {
		return $this->seller;
	}
}